<?php
/*
 * @description: ...
 * @copyright Copyright (c) 2012-2017 Marin V. , Tykva A. , Kozel R. , Sokolov D.
 * @version 1.0
 * @link http://lecturebox.ru
*/

class AuthController extends Model_Controller
{

    public function init()
    {
        parent::init();
        $staticSalt = $this->getFrontController() //извлекаем настройку salt
                ->getParam('bootstrap')->getOption('salt'); //из application.ini        
        Zend_Registry::set('staticSalt', $staticSalt); //заносим staticSalt в Zend_Registry 
    }

    public function indexAction()
    {
        $this->_forward('login');        
    }

    /**
     * Авторизация
     */
    public function loginAction()
    {
        $session = new Zend_Session_Namespace('lectureBox.l10n');
        if ($session->locale) {
            if($session->locale == 'ru_RU'){
                $this->view->title = "Вход в систему";
                $this->view->headTitle()->append('Вход в систему');
            } else {
            $this->view->title = "Sing in";
            $this->view->headTitle()->append('Sing in');
        }
        } 
        
        $loginForm = new Form_Login();
        
        $name = $this->getRequest()->getParam('name');   
        if(isset($name)) {
            $data = array(
                'username' => $name
            );
            $loginForm->populate($data);
        }
       
        if (count($_POST) && $loginForm->isValid($_POST)) 
        { 
            $user = new Model_User();
            $_row = $user->getUserByName($loginForm->getValue('username'));
        
            foreach ($_row as $item){
                 $this->activated = $item['activated'];
                 $this->blocking = $item['blocking'];
            }

            if(!isset($this->activated))
            {
                if ($session->locale) {
                    if($session->locale == 'ru_RU'){
                        $this->_helper->FlashMessenger('<li class="text-error">Ошибка при авторизации: 
                        Такого пользователя не существует!</li>');
                        } else {
                            $this->_helper->FlashMessenger('<li class="text-error">Error: 
                            user does not exist!</li>');
                        }
                } 
                
                $this->_redirect($_SERVER['REQUEST_URI'] . '/name/' . 
                                $loginForm->getValue('username'));
            }
            elseif($this->blocking == 1)
            {
                if ($session->locale) {
                    if($session->locale == 'ru_RU'){
                        $this->_helper->FlashMessenger('<li class="text-error">Ошибка при авторизации: 
                        Ваш аккаунт заблокирован!</li>');
                        } else {
                            $this->_helper->FlashMessenger('<li class="text-error">Error: 
                            Your account has been blocked!</li>');
                        }
                } 
                
                $this->_redirect($_SERVER['REQUEST_URI'] . '/name/' . 
                                $loginForm->getValue('username'));
            }
            else    
            {
                if ($this->activated == 1) 
                {
                        $adapter = new Zend_Auth_Adapter_DbTable(
                        null,
                        TABLE_PREF . 'users',
                        'username',
                        'password',
                        'MD5(CONCAT(?, password_salt,"' //MD5(пароль + уникальный хэш + общий хэш)
                            . Zend_Registry::get('staticSalt') . '"))',
                        'email'                 
                    ); 
                    //идентификатор пользователя
                    $adapter->setIdentity($loginForm->getValue('username'));
                    //параметр для проверки через функцию из Zend_Registry::get('authQuery')
                    $adapter->setCredential($loginForm->getValue('password'));

                    $auth = Zend_Auth::getInstance();
                    if ($auth->authenticate($adapter)->isValid()) //успешная авторизация
                    {
                        if ($session->locale) {
                            if($session->locale == 'ru_RU'){
                                $this->_helper->FlashMessenger('<li class="text-success">Добро пожаловать!</li>');
                            } else {
                            $this->_helper->FlashMessenger('<li class="text-success">Weclome!</li>');
                            }
                        } 
                        // Заносим информацию о пользователе в сессию 
                        $auth->getStorage()->write(
                                $adapter->getResultRowObject(
                                        null, array('password', 'password_salt')
                                )); 
                        // Запоминаем сессию на 30 дней
                        Zend_Session::rememberMe(2592000);
                        $this->_redirect('/');

                        return;
                    } 
                    else
                    {
                        if ($session->locale) {
                            if($session->locale == 'ru_RU'){
                                $this->_helper->FlashMessenger('<li class="text-error">Ошибка при авторизации: 
                                Неправильное сочетание логина и пароля!</li>');
                            } else{
                            $this->_helper->FlashMessenger('<li class="text-error">Error: 
                                Incorrect username and password combination!</li>');
                            }
                        } 
                        $this->_redirect($_SERVER['REQUEST_URI'] . '/name/' . 
                                $loginForm->getValue('username'));
                    }
                }
                else
                {
                    if ($session->locale) {
                            if($session->locale == 'ru_RU'){
                                $this->_helper->FlashMessenger('<li class="text-error">Ошибка при авторизации: 
                                    Ваш аккаунт не активирован!</li>');
                            } else {
                            $this->_helper->FlashMessenger('<li class="text-error">Error: 
                                    Your account is not activated!</li>');
                    }
                    } 
                    $this->_redirect($_SERVER['REQUEST_URI'] . '/name/' .
                            $loginForm->getValue('username')); 
                }   
            }
        }   

        $this->view->form = $loginForm;
    }

    /**
     * Регистрация нового пользователя
     */
    public function signupAction()
    {
        $session = new Zend_Session_Namespace('lectureBox.l10n');
        if ($session->locale) {
           if($session->locale == 'ru_RU'){
                $this->view->title = "Регистрация в системе";
                $this->view->headTitle()->append('Регистрация');
           }else {
               $this->view->title = "Sign Up";
                $this->view->headTitle()->append('Sign Up');
           }
        }
        $this->view->headMeta()->appendName('description',
                'Регистрация в системе');
        
        $form = new Form_Signup();
        $form->removeElement('role2');
        $form->getElement('captcha')->getCaptcha()
                ->setFont(
                    $this->getFrontController()//извлекаем настройку captchaFontFile
                    ->getParam('bootstrap')->getOption('captchaFontFile')
                )
                ->setImgUrl('/www/images/captcha/')
                ->setExpiration(300);
        
        if (count($_POST) && $form->isValid($_POST)) 
        { 
            //создаем уникальную соль для хэширования
            $passwordSalt = $this->salt();

            //добавляем пользователя в базу данных
//            Zend_Db_Table::getDefaultAdapter()->insert(TABLE_PREF . 'users',
//                array(
//                    'username' => $form->getValue('username'),
//                    'role'=> $form->getValue('role')==1? 1:2,
//                    'password' => md5($form->getValue('password') 
//                            . $passwordSalt 
//                            . Zend_Registry::get('staticSalt')),
//                    'password_salt'=> $passwordSalt,
//                    'email'=> $form->getValue('email'),
//                    'code'=> uniqid()
//            ));
            
            $user = new Model_User();
            $user->fill($form->getValues());
            $user->role = $form->getValue('role')==1 ? 1:2;
            $user->password = md5($form->getValue('password') 
                            . $passwordSalt 
                            . Zend_Registry::get('staticSalt'));
            $user->password_salt = $passwordSalt;
            $user->code = uniqid();
            $user->save();
            $user->sendActivationEmail();
            
            $this->_helper->redirector('confirm', 'auth');
            //$this->_helper->redirector('index');
            
//            $user->save();
//            $user->sendActivationEmail($form->getValue('email'));
            //авторизуем
            //return $this->_forward('login');
        }
        $this->view->form = $form;
    }

    public function confirmAction() {
        $session = new Zend_Session_Namespace('lectureBox.l10n');
        $user_id = $this->_getParam('id');
        $code = $this->_getParam('code');
		if(isset($user_id) && isset($code)){
            $user = new Model_User($user_id);
            if ($user->activated) {
                if($session->locale == 'ru_RU'){
                $this->view->message = 'Ваш аккаунт уже активирован.';
                } else{
                 $this->view->message = 'Your account has been activated.'; 
                }
            } else {
                if ($user->code === $code) {
                    $user->activated = true;
                    $user->save();
                    if($session->locale == 'ru_RU'){
                        $this->_helper->FlashMessenger('<li class="text-success">Ваш аккаунт успешно активирован. 
                        Войдите в систему используя свой логин и пароль</li>');
                    } else {
                     $this->_helper->FlashMessenger('<li class="text-success">Your account has been successfully activated.
                             Sign in using your username and password</li>');
                    }

                    $this->_redirect('/auth/login');
                    //$this->view->message = 'Ваш аккаунт успешно активирован.';
                } else {
                        if($session->locale == 'ru_RU'){
                            $this->view->message = 'Неверные данные для активации.<br><br>
                        <a href="http://lecturebox.home/auth/signup">Регистрация в системе</a>';
                        }  else {
                        $this->view->message = 'Incorrect activation data.<br><br>
                        <a href="http://lecturebox.home/auth/signup">Sing Up</a>';
                    }
                }
            }
        }
        
        else {
               if($session->locale == 'ru_RU'){
                $this->view->message = 'На ваш почтовый ящик отправлено письмо с 
                данными для активации.';
               } else {
                $this->view->message = 'Activation data were sent to the email.';
            } 
        }
    }
    
    public function remindAction()
    {
        $session = new Zend_Session_Namespace('lectureBox.l10n');
        if ($session->locale) {
            if($session->locale == 'ru_RU'){
                $this->view->title = "Восстановление пароля";
                $this->view->headTitle()->append('Восстановление пароля');
            } else {
            $this->view->title = "Password recovery";
                $this->view->headTitle()->append('Восстановление пароля');
        }
        } 
        
        $form = new Form_Remind();
        if ($session->locale) {
            if($session->locale == 'ru_RU'){
            $this->view->message = 'Введите свой Email и вам придёт новый пароль.';
         } else {
           $this->view->message = 'Enter your Email and you will receive a new password.';
       }
       }
       // if (count($_POST) && $form->isValid($_POST)){ 
       if($this->getRequest()->isPost()){
           if($form->isValid($this->getRequest()->getPost())){
                //создаем уникальную соль для хэширования
                $newPassword = uniqid();

                $passwordSalt = $this->salt();
                $user = new Model_User();
                //$user->setUserByMail();
                $user->setUserByMail($form->getValue('mail'));

                $user->password = md5($newPassword.$passwordSalt.Zend_Registry::get('staticSalt'));
                $user->password_salt = $passwordSalt;
                $user->save();
                $user->sendNoticeEmail($newPassword);
                if ($session->locale) {
                    if($session->locale == 'ru_RU'){
                        $this->view->message = 'Письмо с новым паролем было выслано вам на почту, сейчас вы будете перенаправленны';
                    } else {
                    $this->view->message = 'A new password sent to you by mail, now you will be redirected';
                }
                } 
                $this->view->code = 1;
                //$this->_helper->redirector('login');
        } else {
            if ($session->locale) {
                    if($session->locale == 'ru_RU'){
                        $this->view->message = 'Вы ввели неверные данные';
                    } else {
                $this->view->message = 'You entered incorrect data';
            }
            } 
        }
        
       }else{
           $this->view->form = $form;
       }
       
    }

    /**
     * Выход
     */
    public function logoutAction()
    {
        $this->view->headTitle()->append('Выход');        
        Zend_Auth::getInstance()->clearIdentity();
        $this->_redirect('/');
    }

    /**
     * Панель управления личными данными аккаунта
     */
    public function profileAction()
    {
        $session = new Zend_Session_Namespace('lectureBox.l10n');
        if ($session->locale) {
          if($session->locale == 'ru_RU'){
            $this->view->title = "Профиль пользователя";
          } else {
              $this->view->title = "User Profile";
          }
        }
        // Проверка прав доступа
        $acl = Zend_Registry::get('acl');
        $auth = Zend_Auth::getInstance();
        $identity = $auth->getIdentity();
        $role = Bootstrap::getRole($identity->role);
        if(!$acl->isAllowed($role, 'mvc:auth', 'profile'))
            return $this->_forward('login');
        
        // Заголовок страницы
        if ($session->locale) {
          if($session->locale == 'ru_RU'){
        $this->view->headTitle()->append('Профиль пользователя ' 
            . htmlspecialchars($identity->username));
          } else {
              $this->view->headTitle()->append('User Profile ' 
            . htmlspecialchars($identity->username));
          }
        }
        // Используем форму
        $form = new Form_Signup();
        // Удаляем капчу
        $form->removeElement('captcha');
        // Делаем неактивным поле логина
        $form->getElement('username')->setAttrib('disabled', 1)->setRequired(false);
        $form->removeElement('role2');
        if ($identity->role == 3)
            $form->removeElement('role');
         
        $form->getElement('email')->setValue($identity->email);
        // Меняем action формы
        $form->setAction(Zend_Navigation_Page_Mvc::factory(array(
                    'action' => 'profile',
                    'controller' => 'auth'
                ))->getHref());
        // Меняем текст на кнопке submit
        $form->getElement('submit')->setLabel('Сохранить данные');
        // Меняем label пароля, пароль менять не обязательно
        $form->getElement('password')->setLabel('Новый пароль')->setRequired(false);
        $form->getElement('password_confirm')->setRequired(false);
        // Декоратор
//        $form->addDecorator('htmlTag', array(
//            'tag' => 'div', 
//            'class' => 'signUpForm')
//        );
        
        
        //$cid = $this->getParam('cid');
        
        if (count($_POST)) 
        { 
            if($form->isValid($_POST))
            {
                if ($identity->role == 3)
                {
                    $data = array (                    
                    'email' => ($identity->email = ($form->getValue('email')))
                    );                      
                }
                else
                {
                    $data = array (                    
                    'role' => ($identity->role = (
                            $form->getValue('role')==1?1:2 )),
                    'email' => ($identity->email = ($form->getValue('email')))
                    );    
                }
                
                $this->view->password_confirm = $this->_request->getPost('password_confirm');
                $form->getElement('email')->setValue($this->_request->getPost('password_confirm'));
                // Если нужно менять пароль
                if(strlen($form->getValue('password_confirm')))
                {
                    //создаем уникальную соль для хэширования
                    $passwordSalt = $this->salt();

                    $data['password'] = md5($form->getValue('password') 
                            . $passwordSalt 
                            . Zend_Registry::get('staticSalt'));
                    $data['password_salt'] = $passwordSalt;
                }

                // Сохраняем изменения в БД
                Zend_Db_Table::getDefaultAdapter()->update(
                        TABLE_PREF . 'users', $data, 'id=' . $identity->id);

                // Обновление данных в сессии
                // Пароль и хэш не будем сохранять в сессии
                unset($data['password']);
                unset($data['password_salt']);
                // Обновляем все данные, которые мы поместили в $data
                foreach($data as $key => $value){
                    if(isset($identity->$key)){
                        $identity->$key = $value;
                    }
                }
                
                if ($session->locale) {
                    if($session->locale == 'ru_RU'){
                        $this->_helper->FlashMessenger('<li class="text-success">Сохранено</li>');
                    } else {
                    $this->_helper->FlashMessenger('<li class="text-success">Saved</li>');
                }
                }
                $this->_redirect($_SERVER['REQUEST_URI']);
            }
        }
        else
        {
            // Вставляем в форму актуальные значения полей
            $form->setDefault('role', $identity->role);
        }
        // Имя пользователя неизменно 
        $form->setDefault('username', $identity->username);
        
        $this->view->user_id = $this->user_id;        
        $this->view->form = $form;     
        
    }

    /**
     * Уникальная случайная строка надежной длинны
     * @return string 
     */
    public function salt()
    {
        $salt = '';
        for($i=0;$i<32;$i++)
            $salt .= mt_rand(0,9);
        return md5($salt);
    }

}







